package pikasial.images;

import java.util.Collection;


/**
 * Interface définissant un conteneur d'images
 * <p>
 * Cette interface est implantée par les classes définissant
 * un objet pouvant contenir des images, c'est-à-dire ayant pour
 * attribut une collection d'images.
 *
 * @author ESIAL - Groupe 14
 */
public interface ImageContainer {

//	/** Pour comparer les images par date de modification. */
//    public static final Comparator<PikImage> PAR_DATE_MODIF =
//        new Comparator<PikImage>() {
//            public int compare(final PikImage p1, final PikImage p2) {
//            	long l1 = p1.getJavaFile().lastModified();
//            	long l2 = p2.getJavaFile().lastModified();
//                if ( l1 < l2) {
//                	return -1;
//                } else if (l1 == l2) {
//                	return 0;
//                } else return 1;
//            }
//    };
//
//    /** Comparer deux photos en fonction de leur date de création (i.e.
//     * jour ou elles ont été prises ==> données EXIF).
//     */
//    @Deprecated
//    public static final Comparator<PikImage> PAR_DATE_CREATION =
//    	new Comparator<PikImage>() {
//    		public int compare(final PikImage p1,final PikImage p2) {
//				return 0;
//    		}
//    };
//
//    /** Comparateur standard par nom de fichier
//     */
//    public static final Comparator<PikImage> PAR_CHEMIN =
//    	new Comparator<PikImage>() {
//    	 	public int compare(final PikImage p1,final PikImage p2) {
//    	 		return p1.getPath().compareTo(p2.getPath());
//    	 	}
//     };


    /**
     * Ajoute une collection d'images au conteneur.
     * <p>
     * Les images sont ajoutées à la fin de la collection
     * attribut du conteneur.
     *
     * @param images - la collection d'images à ajouter.
     */
    void addAllImages(Collection<PikImage> images);

    /**
     * Ajoute une image au conteneur.
     * <p>
     * L'image est ajoutée à la fin de la collection.
     *
     * @param image - l'image à ajouter
     */
    void addImage(PikImage image);

    /**
     * Accède à une image par son indice.
     * <p>
     * Retourne l'image stockée dans la collection à l'indice
     * spécifié en paramètre, ou null si l'indice est
     * hors des limites de la collection d'images.
     *
     * @param index - indice de l'image à retourner
     * @return l'image contenue à l'indice index, ou null
     */
    PikImage getImage(int index);

    /**
     * Retourne le nombre d'image appartenant au conteneur.
     *
     * @return le nombre d'image dans le conteneur
     */
    int getImageCount();

    /**
     * Accède aux images contenues dans un intervalle d'indices.
     * <p>
     * Retourne la collection des images contenues entre les indices
     * <code>indA</code> (inclus) et <code>indB</code> (exclus),
     * ou <code>null</code> si <code>indA</code> est strictement
     * supérieur à <code>indB</code> ou si les indices sont hors des limites.
     *
     * @param indA - indice de la première image à récupérer
     * @param indB - indice de la première image à exclure
     * @return la collection des images contenues dans l'intervalle
     */
    Collection<PikImage> getImageRange(int indA, int indB);

    Collection<PikImage> getAllImages();
    boolean isEmpty();
    /**
     * Supprime toutes les images du conteneur.
     */
    void removeAll();

    /**
     * Supprime l'image contenue à l'index spécifié.
     * @param index - indice de l'image à supprimer.
     */
    void removeImage( int index);
    void removeImage (PikImage pik);

    void removeRange(int ind1,int ind2);
    boolean containsImage(PikImage pik);
    boolean containsImage(String name);
}
